Linux C API 获取广播地址

广播地址通常为网段的最后一个地址

通过对一个 socket 进行 ioctl(SIOCGIFBRDADDR) 即可获取广播地址。

1struct ifreq req;
2strcpy(req.ifr_name, "网卡名");
3ioctl(sock, SIOCGIFBRDADDR, &req);
4inet_ntoa(((struct sockaddr_in*)&(req.ifr_addr))->sin_addr)

遍历网卡的方法可以参考 Linux C API 获取本机的 IP 地址

示例:

1#include <cstdio>
2#include <cstdlib>
3#include <cstring>
4#include <cerrno>
5
6#include <unistd.h>
7#include <sys/socket.h>
8#include <arpa/inet.h>
9#include <net/if.h>
10#include <sys/ioctl.h>
11
12bool getBoardCastAddress(const char* iface, char* buffer, size_t n)
13{
14    int sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
15    if (sock < 0)
16    {
17        fprintf(stderr, "socket: %s\n", strerror(errno));
18        return false;
19    }
20
21
22    struct ifreq req;
23    strcpy(req.ifr_name, iface);
24    if (ioctl(sock, SIOCGIFBRDADDR, &req) < 0)
25    {
26        fprintf(stderr, "ioctl: %s\n", strerror(errno));
27        close(sock);
28        return false;
29    }
30
31    strncpy(buffer, inet_ntoa(((struct sockaddr_in*)&(req.ifr_addr))->sin_addr), n);
32    close(sock);
33    return true;
34}
35
36int main(void)
37{
38    char addr[INET_ADDRSTRLEN];
39    if (!getBoardCastAddress("enp2s0", addr, INET_ADDRSTRLEN))
40    {
41        return EXIT_FAILURE;
42    }
43
44    printf("broadcast %s\n", addr);
45    return EXIT_SUCCESS;
46}